

def KDJ_sign(result):
    """
    1.指标>80 时，回档机率大；指标<20时，反弹机率大； 2.K在20左右向上交叉D时，视为买进信号；
     3.K在80左右向下交叉D时，视为卖出信号； 4.J>100 时，股价易反转下跌；J<0 时，股价易反转上涨；
     5.KDJ 波动于50左右的任何信号，其作用不大。
    :param result:
    :return:
    """
    K, D, J = result['K'].tolist(), result['D'].tolist(), result['J'].tolist()
    KDJ= {}
    for index in range(len(K)):

        if K[index] == D[index] and K[index]>=15 and K[index] <= 25 and index >5 and K[index-5] < K[index]:
            KDJ[index] = 1
        elif K[index] == D[index] and K[index]>=75 and K[index] <= 85 and index >5 and K[index-5] > K[index]:
            KDJ[index] = -1
        elif J[index] > 100:
            KDJ[index] = -1
        elif J[index] < 0:
            KDJ[index] = 1
        else:
            KDJ[index] = 0

    return KDJ



def WR_Sign(result):
    """
    当W&R高于85，即处于超卖状态，行情即将见底，应当考虑买进。当W&R低于15，即处于超买状态，行情即将见顶，
        应当考虑卖出。在W&R进入高位后，一般要回头，如果股价继续上升就产生了背离，是卖出信号。
        在W&R进入低位后，一般要反弹，如果股价继续下降就产生了背离。W&R连续几次撞顶（底），局部形成双重或多重顶（底），
        是卖出（买进）的信号。
    :param result:
    :return:
    """
    LWR = result['WR'].tolist()
    WR = {}
    for index in range(len(LWR)):
        if LWR[index] >= -15:
            WR[index] = 1
        elif LWR[index] <= -85:
            WR[index] = -1
        else:
            WR[index] = 0

    return WR

def LWR_Sign(result):
    """
    LWR2<30，超买；LWR2>70，超卖。
    线LWR1向下跌破线LWR2，买进参考信号；线LWR1向上突破线LWR2，卖出参考信号。
    线LWR1与线LWR2的交叉发生在30以下，70以上，才有效。
    LWR指标不适于发行量小，交易不活跃的股票；
    LWR指标对大盘和热门大盘股有极高准确性。
    :param result:
    :return:
    """
    LWR1, LWR2 = result['LWR1'], result['LWR2']
    LWR = {}
    for index, value in enumerate(result['code']):

        if LWR2[index] <= 30:
            LWR[index] = 1
        elif LWR2[index] >= 70:
            LWR[index] = -1
        elif LWR1[index] == LWR2[index] and  LWR2[index] > 70 and LWR2[index] > 70:
            LWR[index] = 0
        elif LWR1[index] == LWR2[index] and LWR1[index] < 30 and LWR2[index] < 30 :
            LWR[index] = 0
        else:
            LWR[index] = 0

    return LWR


def MACD_sign(result):
    """
    用法： 1.DIFF、DEA均为正，DIFF向上突破DEA，买入信号。
    2.DIFF、DEA均为负，DIFF向下跌破DEA，卖出信号。
     3.DEA线与K线发生背离，行情反转信号。
     4.分析MACD柱状线，由红变绿(正变负)，卖出信号；由绿变红，买入信号
    :param result:
    :return:
    """
    MACD_dif, MACD_dea, MACD_macd = result['macd_dif'].tolist(), result['macd_dea'].tolist(), result['macd_macd'].tolist()
    MACD = {}
    for index in range(len(MACD_dif)):
        # 根据前五日来判断趋势
        if MACD_dif[index] > 0 and MACD_dea[index] >0 and index >5:

            if MACD_dif[index] > MACD_dea[index] and MACD_dif[index-5] < MACD_dea[index-5]:
                MACD[index] = 1
            else:
                MACD[index] = 0
        elif MACD_dif[index] < 0 and MACD_dea[index] < 0 and index >5:
            if MACD_dif[index] < MACD_dea[index] and MACD_dif[index-5] > MACD_dea[index-5]:
                MACD[index] = -1
            else:
                MACD[index] = 0
        else:
            MACD[index] = 0

    return MACD


def BRAR_Sign_JQ(result):
    """
    BR>400，暗示行情过热，应反向卖出；BR<40 ，行情将起死回生，应买进；
    AR>180，能量耗尽，应卖出；AR<40 ，能量已累积爆发力，应买进；
    BR 由300 以上的高点下跌至50以下的水平,低于AR 时,为绝佳买点；
    BR、AR、CR、VR 四者合为一组指标群，须综合搭配使用。
    CR>400时，其10日平均线向下滑落，视为卖出信号；CR<40买进；
    CR 由高点下滑至其四条平均线下方时，股价容易形成短期底部；
    CR 由下往上连续突破其四条平均线时，为强势买进点；
    CR 除了预测价格的外，最大的作用在于预测时间；
    VR>450，市场成交过热，应反向卖出；
    VR<40 ，市场成交低迷，人心看淡的际，应反向买进；
    VR 由低档直接上升至250，股价仍未遭受阻力，此为大行情的前兆；
    :param result:
    :return:
    """
    BR, AR, CR, VR = result['BR'], result['AR'], result['CR'], result['VR']
    MA1, MA2, MA3, MA4 = result['MA1'], result['MA2'], result['MA3'], result['MA4']
    BRAR = {}
    for index, value in enumerate(result['code']):

        if BR[index] > 400 and AR[index] >180 and CR[index] > 400 and VR[index] > 450:
            BRAR[index] = -1
        elif BR[index] < 40 and AR[index] < 40 and CR[index] <40 and VR[index] <40 and CR[index] > result['MA1'] \
                and CR[index] > result['MA2'] and CR[index] > result['MA3']  and CR[index] > result['MA4'] :
            BRAR[index] = 1
        elif BR[index] < AR[index] and BR[index] < 50:
            BRAR[index] = -1
        else:
            BRAR[index] = 0

    return BRAR

def BRAR_Sign(result):
    """
    BR>400，暗示行情过热，应反向卖出；BR<40 ，行情将起死回生，应买进；
    AR>180，能量耗尽，应卖出；AR<40 ，能量已累积爆发力，应买进；
    BR 由300 以上的高点下跌至50以下的水平,低于AR 时,为绝佳买点；
    BR、AR、CR、VR 四者合为一组指标群，须综合搭配使用。

    :param result:
    :return:
    """
    BR, AR = result['BR'].tolist(), result['AR'].tolist()
    BRAR = {}
    for index in range(len(AR)):
        if BR[index] > 400 or AR[index] >180 :
            BRAR[index] = -1
        elif BR[index] < 40 or AR[index] < 40  :
            BRAR[index] = 1
        else:
            BRAR[index] = 0

    return BRAR

def CYR_Sign(result):
    """
   CYR是成本均线派生出的指标,是13日成本均线的升降幅度;
    使用CYR可以对股票的强弱进行排序,找出其中的强势和弱势股票。
    :param result:
    :return:
    """
    CYR, MACYR = result['CYR'], result['MACYR']
    CYR_Sign = {}
    for index, value in enumerate(result['code']):
        CYR_Sign[index] = CYR[index]

    return CYR_Sign

def VRSI_Sign(result):
    """
    相对强弱量
   VRSI>20 为超买；VRSI<20 为超卖；
    VRSI 以50为中界线，大于50视为多头行情，小于50视为空头行情；
    VRSI 在80以上形成Ｍ头或头肩顶形态时，视为向下反转信号；
    VRSI 在20以下形成Ｗ底或头肩底形态时，视为向上反转信号；
    VRSI 向上突破其高点连线时，买进；VRSI 向下跌破其低点连线时，卖出。
    :param result:
    :return:
    """
    VRSI1,VRSI2,VRSI3 = result['VRSI1'], result['VRSI2'], result['VRSI3']
    VRSI = {}
    for index, value in enumerate(result['code']):

        if VRSI1[index] > 50 and VRSI2[index] >50 and VRSI3[index] > 50:
            VRSI[index] = 1
        elif VRSI1[index] < 20 and VRSI2[index] < 20 and VRSI3[index] < 20:
            VRSI[index] = -1
        else:
            VRSI[index] = 0

    return VRSI


def MA_sign(result):
    """
   1.股价高于平均线，视为强势；股价低于平均线，视为弱势
   2.平均线向上涨升，具有助涨力道；平均线向下跌降，具有助跌力道；
    3.二条以上平均线向上交叉时，买进； 4.二条以上平均线向下交叉时，卖出；
    5.移动平均线的信号经常落后股价，若以EXPMA 、VMA 辅助，可以改善。
    :param result:
    :return:
    """
    MA,close = result['MA'].tolist(), result['close'].tolist()
    MA_sign = {}
    for index in range(len(MA)):
        if close[index] > MA[index] :
            MA_sign[index] = 1
        elif close[index] < MA[index]:
            MA_sign[index] = -1
        else:
            MA_sign[index] = 0

    return MA_sign

def BBIBOLL_Sign(result):
    """
    为BBI与BOLL的迭加；
    高价区收盘价跌破BBI线，卖出信号；
    低价区收盘价突破BBI线，买入信号；
    BBI线向上，股价在BBI线之上，多头势强；
    BBI线向下，股价在BBI线之下，空头势强。
    :param result:
    :return:
    """
    bbi, upr, dwn = result['bbi'], result['upr'], result['dwn']
    BOLL = {}
    for index, value in enumerate(result['code']):

        if upr[index] < bbi[index]:
            BOLL[index] = -1
        elif dwn[index] > bbi[index]:
            BOLL[index] = 1
        else:
            BOLL[index] = 0

    return BOLL


def BOLL_Sign(result):
    """
    1.股价上升穿越布林线上限时，回档机率大； 2.股价下跌穿越布林线下限时，反弹机率大；
    3.布林线震动波带变窄时，表示变盘在即；
    result['upperband']
    result['middleband']
    result['lowerband']
    :param result:
    :return:
    """
    upperband, middleband, lowerband = result['upperband'].tolist(), result['middleband'].tolist(), result['lowerband'].tolist()
    BOLL = {}
    closePrice = result['close'].tolist()
    for index in range(len(closePrice)):

        if closePrice[index] > upperband[index]:
            BOLL[index] = -1
        elif closePrice[index] < lowerband[index]:
            BOLL[index] = 1
        else:
            BOLL[index] = 0

    return BOLL

def LB_sign(result):
    """
    量比0.5成交量萎缩到极致，变盘随时发生。 量比0.8--1.5成交量处于正常水平。量比1.5--2.5温和放量，将会延续原有趋势。
    量比2.5--5明显放量，可以采取相应行动了。量比5--10放巨量表现，趋势已到末期。量比>10极端放量，趋势已经到默契，可以考虑反向操作。
    :param result:
    :return:
    """
    lb = result['LB'].tolist()
    lb_sign = {}
    for index in range(len(lb)):
        if lb[index] > 2 and lb[index] < 5:
            lb_sign[index] = 1
        elif lb[index] > 5:
            lb_sign[index] = -1
        else:
            lb_sign[index] = 0

    return lb_sign

def OBV_sign(result):
    """
    能量潮指标（On Balance Volume，OBV）
    1.股价一顶比一顶高，而OBV 一顶比一顶低，暗示头部即将形成； 2.股价一底比一底低，而OBV 一底比一底高，暗示底部即将形成；
    3.OBV 突破其Ｎ字形波动的高点次数达5 次时，为短线卖点； 4.OBV 跌破其Ｎ字形波动的低点次数达5 次时，为短线买点；
    OBV应用技巧主要有两点：1．借助成交量移动平均线，即OBV处于上升状态且10日上穿40日均量线（中短线投资者可使用5日与20日的组合）时，视为买入信号，
    OBV处于无趋势状态且短期均量线下穿中长期均量线时，视为卖出信号。若仍感到难以把握，不妨直接将OBV平滑运算即纳入均线系统；
    2．运用趋势技术，即对OBV值也画出趋势线，对“率先突破”的个股给予重点关注，因为这类个股的运动幅度通常十分可观，这可能是需要把握的最主要的使用技巧。
    result['OBV']
    result['MA_20']
    result['OBV_before']
    :param result:
    :return:
    """
    obv = result['OBV'].tolist()
    maVol20 = result['MAVOL2'].tolist()
    obv_sign = {}
    for index in range(len(maVol20)):
        obv_sign[index] = 0
        if obv[index] > maVol20[index] and index >5:
            if obv[index] > obv[index-5]:
                obv_sign[index] = 1
        elif obv[index] < maVol20[index] and index >5:
            if obv[index] < obv[index - 5]:
                obv_sign[index] = -1
        else:
            obv_sign[index] = 0

    return obv_sign


def MFI_sign(result):
    """
    资金流量指标
    1.MFI>80 为超买，当其回头向下跌破80 时，为短线卖出时机； 2.MFI<20 为超卖，当其回头向上突破20 时，为短线买进时机；
    3.MFI>80，而产生背离现象时，视为卖出信号； 4.MFI<20，而产生背离现象时，视为买进信号。
    :param result:
    :return:
    """
    mfi = result['MFI'].tolist()
    mfi_sign = {}
    for index in range(len(mfi)):
        mfi_sign[index] = 0
        if mfi[index] < 80 and index >5 and mfi[index-5] > 80 :
            mfi_sign[index] = -1
        elif  mfi[index] > 20 and index >5 and mfi[index-5] < 20:
            mfi_sign[index] = 1
        else:
            mfi_sign[index] = 0

    return mfi_sign